#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
class card //手机卡联系人类
{
protected:
	string name; //姓名
	string telephone; //电话号码
public:
	card(string name1, string telephone1) :name(name1), telephone(telephone1) {} //构造函数
	card() {} //无参构造函数
	void set(string name1, string telephone1) //为数据成员赋值
	{
		name = name1;
		telephone = telephone1;
	}
	void modify() //修改数据成员的值
	{
		cout << "请输入你需要更改的信息" << endl;
		cout << "姓名：1    电话号码：2" << endl;
		int choose;
		cin >> choose;
		if (choose == 1)
		{
			cout << "请输入你要更改的姓名" << endl;
			string name2;
			cin >> name2;
			name = name2;
		}
		if (choose == 2)
		{
			cout << "请输入你要更改的电话号码" << endl;
			string telephone2;
			cin >> telephone2;
			telephone = telephone2;
		}
		else
		{
			cout << "您输入的号码无效，请重试" << endl;
			return;
		}
	} //下方函数重载>>运算符
	friend istream& operator>>(istream& input, card& c)
	{
		input >> c.name >> c.telephone;
		return input;
	}
	friend ostream& operator<<(ostream& output, card c) //重载<<运算符
	{
		output << "姓名：" << c.name << " " << "电话号码：" << c.telephone << endl;
		return output;
	}
};
class phone :public card //手机联系人类
{
protected:
	string hometown; //籍贯
	string QQ; //QQ号码
public:
	phone(string name1, string telephoen1, string hometown1, string QQ1) :card(name1, telephoen1) //构造函数
	{
		hometown = hometown1;
		QQ = QQ1;
	}
	phone() :card() {} //无参构造函数
	void set(string name1, string telephone1, string hometown1, string QQ1)
	{
		name = name1;
		telephone = telephone1;
		hometown = hometown1;
		QQ = QQ1;
	}
	void modify() //修改数据成员的值
	{
		cout << "请输入你需要更改的信息" << endl;
		cout << "姓名：1 ;电话号码：2 ;籍贯：3 ；QQ：4" << endl;
		int choose;
		cin >> choose;
		if (choose == 1)
		{
			cout << "请输入你要更改的姓名" << endl;
			string name2;
			cin >> name2;
			name = name2;
		}
		else if (choose == 2)
		{
			cout << "请输入你要更改的电话号码" << endl;
			string telephone2;
			cin >> telephone2;
			telephone = telephone2;
		}
		else if (choose == 3)
		{
			cout << "请输入你要更改的籍贯" << endl;
			string hometown2;
			cin >> hometown2;
			hometown = hometown2;
		}
		else if (choose == 4)
		{
			cout << "请输入你要更改的QQ号码" << endl;
			string QQ2;
			cin >> QQ2;
			QQ = QQ2;
		}
		else
		{
			cout << "您输入的号码无效，请重试" << endl;
			return;
		}
	}  //下方函数重载>>运算符
	friend istream& operator>>(istream& input, phone& p)
	{
		input >> p.name >> p.telephone >> p.hometown >> p.QQ;
		return input;
	}  //下方函数重载<<运算符
	friend ostream& operator<<(ostream& output, phone p)
	{
		output << "姓名：" << p.name << " " << "电话号码：" << p.telephone << " 籍贯： " << p.hometown << " QQ: " << p.QQ << endl;
		return output;
	}
	phone operator=(phone p) //为后面的删除联系人逐项修改准备
	{
		name = p.name;
		telephone = p.telephone;
		hometown = p.hometown;
		QQ = p.QQ;
		return *this; //此处注意需要返回*this
	}
	bool operator==(phone p) //为后面的避免相同联系人做准备
	{
		if (telephone == p.telephone)
			return true;
		return false;
	}
	phone copy(phone p1) //复制赋值函数
	{
		name = p1.name;
		telephone = p1.telephone;
		hometown = p1.hometown;
		QQ = p1.QQ;
		return *this;
	} //以下的四个操作为提取数据成员的函数
	string getname()
	{
		return name;
	}
	string gettelephone()
	{
		return telephone;
	}
	string gethometown()
	{
		return hometown;
	}
	string getQQ()
	{
		return QQ;
	}
};
class Address_book //通讯簿抽象类
{ //以下的6个函数为抽象类
public:
	virtual void add() {}
	virtual void add(phone p) {}
	virtual void reduce() {}
	virtual void display() {}
	virtual void modify(string teleph) {}
	virtual void query(string na) {}
};
class phone_address :public Address_book //手机通讯簿类
{
protected:
	int number_ph; //手机成员的数量
	phone ph_add[1000]; //手机中通讯录
public:
	phone_address() //构造函数
	{
		number_ph = 0;
		ifstream fp1;
		fp1.open("phone.txt"); //具体位置根据现场情况而定
		while (fp1 >> ph_add[number_ph])
		{
			number_ph++;
		}
		fp1.close();
	}
	~phone_address() //析构函数
	{
		ofstream fp2;
		fp2.open("phone.txt", ios::out); //具体位置根据现场情况而定
		int i = 0, sum = number_ph;
		while (sum--)
		{
			fp2 << ph_add[i];
			i++;
		}
		fp2.close();
	}
	void add() //增加一个联系人
	{
		string name3, telephone3, hometown3, QQ3;
		cout << "请输入增加联系人的姓名：" << endl;
		cin >> name3;
		cout << "请输入增加联系人的电话号码：" << endl;
		cin >> telephone3;
		cout << "请输入增加联系人的籍贯：" << endl;
		cin >> hometown3;
		cout << "请输入增加联系人的QQ：" << endl;
		cin >> QQ3;
		ph_add[number_ph].set(name3, telephone3, hometown3, QQ3);
		number_ph++;
		cout << "增加联系人完成，目前联系人数目为：" << number_ph << endl;
	}
	void add(phone p) //增加一个已知的联系人
	{
		ph_add[number_ph].set(p.getname(), p.gettelephone(), p.gethometown(), p.getQQ());
		number_ph++;
	}
	void reduce(string telep) //删除一个联系人
	{
		int k = 0;
		for (int i = 0; i < number_ph; ++i)
		{
			if (ph_add[i].gettelephone() == telep)
			{
				k++;
			}
			if (k != 0)
			{
				ph_add[i] = ph_add[i + 1];
			}
		}
		if (k == 0)
		{
			cout << "该手机通讯簿没有此联系人！" << endl;
		}
		else
		{
			number_ph--;
			cout << "手机删除联系人完成，手机目前联系人数目为：" << number_ph << endl;
		}
	}
	void display() //显示联系人操作
	{
		if (number_ph <= 0)
		{
			cout << "该手机中无联系人！" << endl;
			return;
		}
		for (int i = 0; i < number_ph; ++i)
		{
			cout << ph_add[i];
		}
	}
	void modify(string teleph) //修改某一联系人的信息
	{
		for (int i = 0; i < number_ph; ++i)
		{
			if (ph_add[i].gettelephone() == teleph)
			{
				ph_add[i].modify();
				break;
			}
		}
	}
	void query(string na) //查询并显示某一联系人的信息
	{
		for (int i = 0; i < number_ph; ++i)
		{
			if (ph_add[i].getname() == na)
			{
				cout << "手机联系人：  " << endl;
				cout << ph_add[i];
			}
		}
	}
	void clear() //清空操作函数
	{
		number_ph = 0;
	}
	int getnumber() //提取数据成员number_ph的函数
	{
		return number_ph;
	}
	void pronumber() //数据成员number_ph自增的函数
	{
		number_ph++;
	}
	phone getph(int i) //通过引用下表为形参提取数组
	{
		return ph_add[i];
	}
};
class Card_address :public Address_book //手机卡通信簿类
{
protected:
	int number_C;//手机卡成员的数量 
	phone ph_C[1000]; //手机卡中通讯录
public:
	Card_address() //构造函数
	{
		number_C = 0;
		ifstream fp1;
		fp1.open("Card.txt", ios::in); //具体位置根据现场情况而定
		while (fp1 >> ph_C[number_C])
		{
			number_C++;
		}
		fp1.close();
	}
	~Card_address() //析构函数
	{
		ofstream fp2;
		fp2.open("Card.txt", ios::out); //具体位置根据现场情况而定
		int i = 0, sum = number_C;
		while (sum--)
		{
			fp2 << ph_C[i];
			i++;
		}
		fp2.close();
	}
	void add() //增加一个联系人
	{
		string name3, telephone3, hometown3, QQ3;
		cout << "请输入增加联系人的姓名：" << endl;
		cin >> name3;
		cout << "请输入增加联系人的电话号码：" << endl;
		cin >> telephone3;
		cout << "请输入增加联系人的籍贯：" << endl;
		cin >> hometown3;
		cout << "请输入增加联系人的QQ：" << endl;
		cin >> QQ3;
		ph_C[number_C].set(name3, telephone3, hometown3, QQ3);
		number_C++;
		cout << "增加联系人完成，目前联系人数目为：" << number_C << endl;
	}
	void add(phone p) //增加一个已知的联系人
	{
		ph_C[number_C].set(p.getname(), p.gettelephone(), p.gethometown(), p.getQQ());
		number_C++;
	}
	void reduce(string telep) //删除一个联系人
	{
		int k = 0;
		for (int i = 0; i < number_C; ++i)
		{
			if (ph_C[i].gettelephone() == telep)
			{
				k++;
			}
			if (k != 0)
			{
				ph_C[i] = ph_C[i + 1];
			}
		}
		if (k == 0)
		{
			cout << "该手机卡通讯簿没有此联系人！" << endl;
		}
		else
		{
			number_C--;
			cout << "手机卡删除联系人完成，手机卡目前联系人数目为：" << number_C << endl;
		}
	}
	void display() //显示联系人操作
	{
		if (number_C <= 0)
		{
			cout << "该手机卡中无联系人！" << endl;
			return;
		}
		for (int i = 0; i < number_C; ++i)
		{
			cout << ph_C[i];
		}
	}
	void modify(string teleph) //修改某一联系人的信息
	{
		for (int i = 0; i < number_C - 1; ++i)
		{
			if (ph_C[i].gettelephone() == teleph)
			{
				ph_C[i].modify();
				break;
			}
		}
	}
	void query(string na) //查询并显示某一联系人的信息
	{
		for (int i = 0; i < number_C; ++i)
		{
			if (ph_C[i].getname() == na)
			{
				cout << "手机卡联系人：  " << endl;
				cout << ph_C[i];
			}
		}
	}
	void clear() //清空操作
	{
		number_C = 0;
	}
	int getnumber() //提取数据成员number_C的操作
	{
		return number_C;
	}
	void pronumber() //数据成员number_C自增
	{
		number_C++;
	}
	phone getph(int i) //通过引用下表为形参提取数组
	{
		return ph_C[i];
	}
};
class User //用户类
{
protected:
	phone_address ph_add;  //通过手机通讯录类定义一个成员
	Card_address C_add;  //通过手机卡通讯录类定义一个成员
public:
	void User_add(int ch1) //增加一个联系人
	{
		Address_book* Address_p;
		if (ch1 == 1)
		{
			Address_p = &ph_add;
			Address_p->add();
		}
		else if (ch1 == 2)
		{
			Address_p = &C_add;
			Address_p->add();
		}
		else if (ch1 == 0)
		{
			return;
		}
		else
		{
			cout << "您输入的序号无效！" << endl;
			return;
		}
	}
	void User_reduce() //删除一个联系人
	{
		string telephone4;
		cin >> telephone4;
		ph_add.reduce(telephone4);
		C_add.reduce(telephone4);
	}
	void display(int ch5) //显示联系人
	{
		Address_book* Address_p;
		if (ch5 == 1)
		{
			Address_p = &ph_add;
			Address_p->display();
		}
		else if (ch5 == 2)
		{
			Address_p = &C_add;
			Address_p->display();
		}
		else if (ch5 == 0)
		{
			return;
		}
		else
		{
			cout << "您输入的序号无效！" << endl;
			return;
		}
	}
	void modify() //修改联系人
	{
		Address_book* Address_p;
		string telep;
		cout << "请输入您需要修改联系人的电话号码" << endl;
		cin >> telep;
		Address_p = &ph_add;
		Address_p->modify(telep);
		Address_p = &C_add;
		Address_p->modify(telep);
	}
	void query() //查询联系人
	{
		Address_book* Address_p;
		cout << "请输入您需要查询的人的名字：" << endl;
		string name4;
		cin >> name4;
		Address_p = &ph_add;
		Address_p->query(name4);
		Address_p = &C_add;
		Address_p->query(name4);
	}
	void ph_move_C() //手机转存到手机卡
	{
		if (ph_add.getnumber() <= 0)
		{
			cout << "手机中已无联系人！" << endl;
			return;
		}
		for (int i = 0; i < ph_add.getnumber(); ++i)
		{
			int k = 0;
			for (int j = 0; j < C_add.getnumber(); ++j) //二重循环判断是否联系人重读，下同
			{
				if (ph_add.getph(i) == C_add.getph(j))
				{
					k++;
					break;
				}
			}
			if (ph_add.getnumber() == 0) k = 0;
			if (k == 0)
			{
				C_add.add(ph_add.getph(i));
			}
			if (C_add.getnumber() > 1000) //防止数据溢出，下同
			{
				cout << "手机卡联系人已满，无法加入更多联系人" << endl;
				return;
			}
		}
		ph_add.clear();
	}
	void C_move_ph() // 手机卡转存到手机中
	{
		if (C_add.getnumber() <= 0)
		{
			cout << "手机卡中已无联系人！" << endl;
			return;
		}
		for (int i = 0; i < C_add.getnumber(); ++i)
		{
			int k = 0;
			for (int j = 0; j < ph_add.getnumber(); ++j)
			{
				if (C_add.getph(i) == ph_add.getph(j))
				{
					k++;
					break;
				}
			}
			if (C_add.getnumber() == 0) k = 0;
			if (k == 0)
			{
				ph_add.add(C_add.getph(i));
			}
			if (ph_add.getnumber() > 1000)
			{
				cout << "手机联系人已满，无法加入更多联系人" << endl;
				return;
			}
		}
		C_add.clear();
	}
	void ph_copy_C() //手机复制到手机卡中
	{
		if (ph_add.getnumber() <= 0)
		{
			cout << "手机中已无联系人！" << endl;
			return;
		}
		for (int i = 0; i < ph_add.getnumber(); ++i)
		{
			int k = 0;
			for (int j = 0; j < C_add.getnumber(); ++j)
			{
				if (ph_add.getph(i) == C_add.getph(j))
					k++;
			}
			if (ph_add.getnumber() == 0) k = 0;
			if (k == 0)
			{
				C_add.add(ph_add.getph(i));
			}
			if (C_add.getnumber() > 1000)
			{
				cout << "手机卡联系人已满，无法加入更多联系人" << endl;
				return;
			}
		}
	}
	void C_copy_ph() //手机卡复制到手机中
	{
		if (C_add.getnumber() <= 0)
		{
			cout << "手机卡中已无联系人！" << endl;
			return;
		}
		for (int i = 0; i < C_add.getnumber(); ++i)
		{
			int k = 0;
			for (int j = 0; j < ph_add.getnumber(); ++j)
			{
				if (C_add.getph(i) == ph_add.getph(j))
					k++;
			}
			if (C_add.getnumber() == 0) k = 0;
			if (k == 0)
			{
				ph_add.add(C_add.getph(i));
			}
			if (ph_add.getnumber() > 1000)
			{
				cout << "手机联系人已满，无法加入更多联系人" << endl;
				return;
			}
		}
	}
};
class Menu //界面菜单类
{
public:
	void mainmenu() //主菜单
	{
		cout << "          **欢迎使用宇轩手机管理系统，宇轩竭诚为您服务^-^ **" << endl;
		cout << "          **************************************************" << endl;
		cout << "          *   1. 新建联系人                                *" << endl;
		cout << "          *   2. 删除联系人                                *" << endl;
		cout << "          *   3. 修改联系人信息                            *" << endl;
		cout << "          *   4. 查询联系人信息                            *" << endl;
		cout << "          *   5. 浏览全部联系人                            *" << endl;
		cout << "          *   6. 手机和手机卡复制转存操作                  *" << endl;
		cout << "          *   0. 离开本操作系统                            * " << endl;
		cout << "          **************************************************" << endl;
	}
	void addusermenu() //增加联系人菜单
	{
		cout << "          **欢迎使用宇轩手机管理系统，宇轩竭诚为您服务^-^ **" << endl;
		cout << "          **************************************************" << endl;
		cout << "          *   1. 在手机中新建联系人                        *" << endl;
		cout << "          *   2. 在手机卡中新建联系人                      *" << endl;
		cout << "          *   0. 返回上一级                                *" << endl;
		cout << "          **************************************************" << endl;
	}
	void deleteusermenu() //删除联系人菜单
	{
		cout << "          **欢迎使用宇轩手机管理系统，宇轩竭诚为您服务^-^ **" << endl;
		cout << "          **************************************************" << endl;
		cout << "          *       请需要输入您想要删除的人的电话号码       *" << endl;
		cout << "          **************************************************" << endl;
	}
	void changeusermenu() //修改联系人菜单
	{
		cout << "          **欢迎使用宇轩手机管理系统，宇轩竭诚为您服务^-^ **" << endl;
		cout << "          **************************************************" << endl;
		cout << "          *          请输入您想要修改的人的电话号码        *" << endl;
		cout << "          **************************************************" << endl;
	}
	void queryusermenu() //查询联系人菜单
	{
		cout << "          **欢迎使用宇轩手机管理系统，宇轩竭诚为您服务^-^ **" << endl;
		cout << "          **************************************************" << endl;
		cout << "          *         请需要输入您想要查询的人的名字         *" << endl;
		cout << "          **************************************************" << endl;
	}
	void displayallmenu() //显示全部联系人菜单
	{
		cout << "          **欢迎使用宇轩手机管理系统，宇轩竭诚为您服务^-^ **" << endl;
		cout << "          *   1. 查看手机上的全部联系人                    *" << endl;
		cout << "          *   2. 查看手机卡上的全部联系人                  *" << endl;
		cout << "          *   0. 返回上一级                                *" << endl;
		cout << "          **************************************************" << endl;
	}
	void transmenu() //手机与手机卡的复制转存操作
	{
		cout << "          **欢迎使用宇轩手机管理系统，宇轩竭诚为您服务^-^ **" << endl;
		cout << "          *   1. 将联系人的信息从手机转存到手机卡上        *" << endl;
		cout << "          *   2. 将联系人的信息从手机卡转存到手机上        *" << endl;
		cout << "          *   3. 将联系人的信息从手机复制到手机卡上        *" << endl;
		cout << "          *   4. 将联系人的信息从手机卡上复制到手机上      *" << endl;
		cout << "          *   0. 返回上一级                                *" << endl;
		cout << "          **************************************************" << endl;
	}
};
int main() //主函数实现上述相关类的作用
{
	User user; //定义一个用户类
	Menu menu; //定义一个菜单类
	while (1) //不断进行相关操作
	{
		menu.mainmenu(); //首先调用主菜单
		int choose;
		cin >> choose;
		switch (choose)
		{
		case 1: //新建联系人
		{
			menu.addusermenu();
			int ch1;
			cin >> ch1;
			user.User_add(ch1);
			break;
		}
		case 2: //删除联系人
		{
			menu.deleteusermenu();
			user.User_reduce();
			break;
		}
		case 3: //修改联系人信息，输入电话号码查询到联系人后修改，若两个都有全部删除
		{
			menu.changeusermenu();
			user.modify();
			break;
		}
		case 4: //根据名字查询联系人信息（查询结果不唯一）
		{
			menu.queryusermenu();
			user.query();
			break;
		}
		case 5: //浏览全部联系人
		{
			menu.displayallmenu();
			int ch5;
			cin >> ch5;
			user.display(ch5);
			break;
		}
		case 6:
		{
			menu.transmenu(); //转存复制菜单
			int choose1;
			cin >> choose1;
			if (choose1 == 1)
			{
				user.ph_move_C();
			}
			else if (choose1 == 2)
			{
				user.C_move_ph();
			}
			else if (choose1 == 3)
			{
				user.ph_copy_C();
			}
			else if (choose1 == 4)
			{
				user.C_copy_ph();
			}
			break;
		}
		case 0:
		{
			return 0;
		}
		}
		system("pause"); //可视化界面的相关操作
		system("cls");
	}
	return 0;
}
